import pandas as pd
import numpy as np


def func1():
    df1 = pd.DataFrame(
        np.arange(16).reshape(4, 4),  # 16个数字，转成 4*4 的格式
        columns=["A", "B", "C", "D"],
        index=["a", "b", "c", "d"]
    )

    # 参数 period - 表示每次移动的幅度
    print(df1)
    print(df1.shift())  # 默认移动--向下移动
    print(df1.shift(1))  # 向下移动1步，等于上面的结果
    print(df1.shift(3))  # 向下移动3步

    print(df1.shift(axis=0))  # 向下移动
    print(df1.shift(axis="index"))  # 向下移动
    print(df1.shift(axis=1))  # 向右移动
    print(df1.shift(axis="columns"))  # 向右移动
    print(df1.shift(-2, axis=1))  # 向左移动两步

    print(df1.shift(fill_value=0))  # 第一行的缺失值填充 0
    print(df1.shift(fill_value=88))  # 第一行的缺失值填充 88
    print(df1.shift(-2, fill_value=88))  # 最后两行的缺失值填充 88


def func2():
    # 针对时间的
    df2 = pd.DataFrame(
        data={
            "col1": [10, 20, 30, 45, 75, 88],
            "col2": [13, 23, 18, 33, 48, 66],
            "col3": [17, 27, 22, 37, 53, 77],
        },
        index=pd.date_range("2023-07-14", "2023-07-19")
    )

    # 参数 freq
    print(df2)
    # 时间索引移动了3天(D)，但是每行的数据是不变的
    print(df2.shift(periods=3, freq="D"))  # 日历的日频率

    print(df2.shift(periods=1, freq="Q"))  # 每个季度最后一个月的最后一个工作日
    print(df2.shift(periods=1, freq="BMS"))  # 每月的第一个工作日


if __name__ == '__main__':
    func2()
